/**
 * JSFX Name: ReaAnalog
 * About: Virtual Summing Channel in Reaper
 * Author: Giovanni Gramegna (aka mrlimbic aka vordio)
 * Licence: GPL v3
 * ReaAnalog
 * Version: 1.0
 */

// (C) 2020-2021, Giovanni Gramegna

// NO WARRANTY IS GRANTED. THIS PLUG-IN IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
// WARRANTY OF ANY KIND. NO LIABILITY IS GRANTED, INCLUDING, BUT NOT LIMITED TO,
// ANY DIRECT OR INDIRECT,  SPECIAL,  INCIDENTAL OR CONSEQUENTIAL DAMAGE ARISING
// OUT OF  THE  USE  OR INABILITY  TO  USE  THIS PLUG-IN,  COMPUTER FAILTURE  OF
// MALFUNCTION INCLUDED.  THE USE OF THE SOURCE CODE,  EITHER  PARTIALLY  OR  IN
// TOTAL, IS ONLY GRANTED,  IF USED IN THE SENSE OF THE AUTHOR'S INTENTION,  AND
// USED WITH ACKNOWLEDGEMENT OF THE AUTHOR. FURTHERMORE IS THIS PLUG-IN A  THIRD
// PARTY CONTRIBUTION,  EVEN IF INCLUDED IN REAPER(TM),  COCKOS INCORPORATED  OR
// ITS AFFILIATES HAVE NOTHING TO DO WITH IT.  LAST BUT NOT LEAST, BY USING THIS
// PLUG-IN YOU RELINQUISH YOUR CLAIM TO SUE IT'S AUTHOR, AS WELL AS THE CLAIM TO
// ENTRUST SOMEBODY ELSE WITH DOING SO.

//tags: saturation glue tonal shaping

desc:ReaAnalog

slider1:0<0,100,1>Drive(%):
slider2:0<0,4,{Clean,Classic,Fat,Dark,Big,Bright}>Color:

@init

r1L=(rand()/20)+0.99;
r2L=(rand()/20)+0.99;
r3L=(rand()/20)+0.99;

r1R=(rand()/20)+0.99;
r2R=(rand()/20)+0.99;
r3R=(rand()/20)+0.99;


f1a0=-0.61;
f1a1=-0.7;
f1a2=0.01;

f2a0=-2;
f2a1=1.95;
f2b1=-0.99;

f3a0=-1.66;
f3a1=1.4;
f3b1=-0.68;


@slider
reg00=slider1;
reg01=slider2;
wet = (slider1)/100;
dry = 1 - wet;
color = slider2;

@block
slider1=reg00;
slider2=reg01;
wet = (slider1)/100;
dry = 1 - wet;
color = slider2;
color == 0 ?
(
  f1a0=3;
  f1a1=0;
  f1a2=0;
  
  f2a0=1;
  f2a1=0;
  f2b1=0;
  
  f3a0=1;
  f3a1=0;
  f3b1=0;
  
);

color == 1 ?
(

  f1a0=3;
  f1a1=2.9;
  f1a2=-1;
  
  f2a0=0.6;
  f2a1=0;
  f2b1=0;
  
  f3a0=-0.99;
  f3a1=0.99;
  f3b1=-0.99;
) :

color == 2 ?
(
  f1a0=0.01;
  f1a1=0.4;
  f1a2=3;
  
  f2a0=0.55;
  f2a1=0;
  f2b1=0;
  
  f3a0=-1.46;
  f3a1=1.4;
  f3b1=-0.97;
) :

color == 3 ?
(
  f1a0=0.3;
  f1a1=1.9;
  f1a2=0.6;
  
  f2a0=1.1;
  f2a1=0;
  f2b1=0;
  
  f3a0=1;
  f3a1=0;
  f3b1=0;
) :

color == 4 ?
(
  f1a0=0.1;
  f1a1=2;
  f1a2=-0.4;
  
  f2a0=-1.4;
  f2a1=1.405;
  f2b1=-0.999;
  
  f3a0=1.2;
  f3a1=0;
  f3b1=0;
) :

color == 5 ?
(
  f1a0=1;
  f1a1=-1.5;
  f1a2=-1;
  
  f2a0=1.1;
  f2a1=0;
  f2b1=0;
  
  f3a0=1;
  f3a1=1.5;
  f3b1=0.5;
);
@sample


//Drive

color == 0 || color == 4  ?
(
  spl0=(spl0*dry)+wet*0.18*sin(6*spl0);
  spl1=(spl1*dry)+wet*0.18*sin(6*spl1);
) :

color == 1 ?
(
  spl0>=0 ?
  (
    spl0=(spl0*dry)+wet*0.7*sin(spl0);
  ) :
  (
    spl0=(spl0*dry)+wet*0.7*sin(2*spl0);
  );
  
  spl1>=0 ?
  (
    spl1=(spl1*dry)+wet*0.7*sin(spl1);
  ) :
  (
    spl1=(spl1*dry)+wet*0.7*sin(2*spl1);
  );
) :

color == 2 || color == 5 ?
(
  spl0=(spl0*dry)+wet*0.09*atan(15*spl0);
  spl1=(spl1*dry)+wet*0.09*atan(15*spl1);
) :

color == 3 ?
(
  spl0=(spl0*dry)+wet*(1.4*spl0/(1+5*abs(spl0)));
  spl1=(spl1*dry)+wet*(1.4*spl1/(1+5*abs(spl1)));
);


//Color

f1xnL=spl0;
f1ynL=f1a0*r1L*f1xnL+f1a1*r1L*f1xn1L+f1a2*r1L*f1xn2L;
spl0=f1ynL;
f1xn2L=f1xn1L;
f1xn1L=f1xnL;

f1xnR=spl1;
f1ynR=f1a0*r1R*f1xnR+f1a1*r1R*f1xn1R+f1a2*r1R*f1xn2R;
spl1=f1ynR;
f1xn2R=f1xn1R;
f1xn1R=f1xnR;

f2xnL=spl0;
f2ynL=f2a0*r2L*f2xnL+f2a1*r2L*f2xn1L-f2b1*f2yn1L;
spl0=f2ynL*0.33;
f2yn1L=f2ynL;
f2xn1L=f2xnL;

f2xnR=spl1;
f2ynR=f2a0*r2R*f2xnR+f2a1*r2R*f2xn1R-f2b1*f2yn1R;
spl1=f2ynR*0.33;
f2yn1R=f2ynR;
f2xn1R=f2xnR;


f3xnL=spl0;
f3ynL=f3a0*r3L*f3xnL+f3a1*r3L*f3xn1L-f3b1*f3yn1L;
spl0=f3ynL*0.94;
f3yn1L=f3ynL;
f3xn1L=f3xnL;

f3xnR=spl1;
f3ynR=f3a0*r3R*f3xnR+f3a1*r3R*f3xn1R-f3b1*f3yn1R;
spl1=f3ynR*0.94;
f3yn1R=f3ynR;
f3xn1R=f3xnR;

